package edu.unice.simul.vue.components.simul;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;

import edu.unice.simul.controleur.SimulationControleur;
import edu.unice.simul.vue.moteur_graphique.MoteurGraphique;

/**
 * Panneau de contrôle de la simulation
 * 
 * @author Romain Ciaccafava
 * 
 */
public class ControlsPanel extends JPanel {
	private static final long serialVersionUID = -2601355865227768788L;

	private final SimulationControleur controleur;
	private MoteurGraphique moteurGraphique;

	public ControlsPanel(SimulationControleur controleur,
			MoteurGraphique moteurGraphique) {
		this.controleur = controleur;
		this.moteurGraphique = moteurGraphique;

		buildUI();
	}

	private SpeedSlider slider;
	private PlayPausePanel playPausePanel;

	/**
	 * Construit l'interface
	 */
	private void buildUI() {
		this.slider = new SpeedSlider(controleur);
		this.playPausePanel = new PlayPausePanel(controleur);
		add(playPausePanel);

		final JButton evacuation = new JButton("Évacuer !");
		evacuation.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				evacuation.setEnabled(false);
				controleur.lancerEvacuation();
			}
		});
		add(evacuation);

		slider.setBorder(BorderFactory.createTitledBorder("Vitesse"));
		add(slider);

		JPanel propertiesPanel = new JPanel();
		propertiesPanel.setLayout(new GridLayout(3, 1));

		propertiesPanel.setBorder(BorderFactory.createTitledBorder("Affichage"));

		JCheckBox afficherVision = new JCheckBox(
				"Afficher le champ de vision des humains", true);
		JCheckBox afficherDirection = new JCheckBox(
				"Afficher la direction des humains", true);
		JCheckBox afficherVie = new JCheckBox("Afficher le niveau de vie", false);

		propertiesPanel.add(afficherVision);
		propertiesPanel.add(afficherDirection);
		propertiesPanel.add(afficherVie);

		add(propertiesPanel);

		afficherDirection.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent ev) {
				moteurGraphique.afficherDirection(ev.getStateChange() == ItemEvent.SELECTED);
				moteurGraphique.repaint();
			}
		});

		afficherVision.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent ev) {
				moteurGraphique.afficherVision(ev.getStateChange() == ItemEvent.SELECTED);
				moteurGraphique.repaint();
			}
		});

		afficherVie.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				moteurGraphique.afficherVie(e.getStateChange() == ItemEvent.SELECTED);
				moteurGraphique.repaint();
			}
		});
	}

	/**
	 * Vérouille le panneau
	 */
	public void freeze() {
		slider.setEnabled(false);
		playPausePanel.freeze();
	}

}
